﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Diagnostics;


namespace ConsoleApplication27
{
    public static class Pomoce
    {



        public static List<Liczba> konwersja(Liczba a,Liczba system)
        {
            

            Liczba t;

            List<Liczba> kolejka = new List<Liczba>();


            while (a.element[0] != 0)
            {

                t = a % system;

                // Console.WriteLine("binaryzacja: " + a + " " + t);
                kolejka.Add(t);

                a = a / system;

            }





           
            return kolejka;
        }

        public static Liczba do10(List<ulong> a, Liczba system)
        {
            
            Liczba wynik = new Liczba("0", 10);
            List<Liczba> lista = new List<Liczba>();

            Liczba System=system;
            lista.Add(new Liczba("1", 10));
            lista.Add(System);
            Console.WriteLine("trololo");
            
            for(int i=1;i<a.Count-1;i++)
            {
                System=System*system;
                lista.Add(System);
            }


            for(int i=0;i<=a.Count-1;i++)
            {
                
                System = lista[lista.Count-1-i];
                
                wynik = wynik + new Liczba(a[i].ToString(), 10) * System;

            }

            return wynik;

        }






       
        public static int Porownaj(Liczba a, Liczba b)
        {
            if (a.element.Count > b.element.Count) return 1;
            else if (a.element.Count != b.element.Count) return 0;

            int i = 0;

            while (i < a.element.Count)
            {
                if (a.element[i] != b.element[i]) return (a.element[i] > b.element[i]) ? 1 : 0;
                i++;
            }
            return 2;

        }

        private static ulong NextInt64(this Random rnd)
        {
            var buffer = new byte[sizeof(Int64)];
            rnd.NextBytes(buffer);
           
            return BitConverter.ToUInt64(buffer, 0);

        }


        public static Liczba random(Liczba a,Random r)
        {
            List<ulong> liczba = new List<ulong>();
            
            int dlugosc = a.element.Count();
            int dlugoscrandoma = r.Next(dlugosc, dlugosc);


            ulong temp = 0;

            if (dlugoscrandoma == dlugosc)
            {
                temp = r.NextInt64();
                temp = temp % a.system;
                while (a.element[0] < temp || temp==0)
                {
                    temp = r.NextInt64();
                    temp = temp % a.system;
                   
                   
                }
               
                liczba.Add(temp);



                for (int i = 1; i < dlugoscrandoma; i++)
                {
                    temp = r.NextInt64();
                    temp = temp % a.system;


                    while (a.element[i] < temp)
                    {
                        temp = r.NextInt64();
                        temp = temp % a.system;
                    }
                    
                    liczba.Add(temp);
                }

            }
            else
            {
                temp = r.NextInt64();
                temp = temp % a.system;
                while (temp == 0)
                {
                    temp = r.NextInt64();
                    temp = temp % a.system;
                }
               
                liczba.Add(temp);


                for (int i = 1; i < dlugoscrandoma; i++)
                {
                    temp = r.NextInt64();
                    temp = temp % a.system;
                    liczba.Add(temp);
                }
            }
           
            return new Liczba(liczba, a.system);
        }

        public static Liczba randomodd(Liczba a,Random r)
        {
            Liczba temp=random(a,r);
            if (temp.element[temp.element.Count()-1] % 2==0) temp.element[temp.element.Count()-1]++;
            return temp;
        }

       

        

    }
}
